JavaScript'ning nuqsonli Date obyektidan charchadingizmi? Ushbu qo'llanma yangi Temporal API va uning polifilini o'rganib, global ilovalarda sana, vaqt va vaqt mintaqalarini aniqlik bilan boshqarish imkonini beradi.
Date'dan tashqari: Temporal Polyfill bilan JavaScript kelajagini o'zlashtiring
O'n yillar davomida butun dunyo dasturchilari umumiy bir muammoga duch kelishdi: JavaScript Date obyekti. Bu son-sanoqsiz xatoliklar, tun bo'yi davom etgan tuzatishlar va internatsionalizatsiya bilan bog'liq bosh og'riqlarining manbai bo'lib kelgan. Uning o'zgaruvchan tabiati, chalkash API'si va vaqt mintaqalarini juda yomon qo'llab-quvvatlashi mustahkam sana va vaqt mantiqini yaratishni jiddiy qiyinchilikka aylantirdi. Ammo bu davr nihoyat o'z yakuniga yetmoqda.
Temporal API — JavaScript'da sana va vaqt bilan ishlashni inqilob qilish uchun mo'ljallangan zamonaviy, keng qamrovli va ajoyib tarzda ishlab chiqilgan taklif bilan tanishing. U dasturchilar uchun o'zgarmas, aniq va kuchli vositalar to'plamini taklif etadi. Yagona muammo? U hali barcha brauzerlar va JavaScript ishga tushirish muhitlarida mavjud emas. Aynan shu yerda Temporal Polyfill yordamga keladi. Bu kelajakka ko'prik bo'lib, sizga bugunoq toza, ishonchli va kelajakka mo'ljallangan sana/vaqt kodini yozish imkonini beradi. Ushbu qo'llanma sizni nima uchun eski Date obyektini ortda qoldirishingiz kerakligi va global ilovalaringiz uchun Temporal Polyfill'ni qanday o'zlashtirish haqida chuqur ma'lumot beradi.
Nima uchun JavaScript'ning `Date` obyektidan voz kechishimiz kerak
Yechimni o'rganishdan oldin, muammoning mohiyatini tushunish juda muhim. Agar siz JavaScript bilan biror vaqt ishlagan bo'lsangiz, quyidagi muammolarga duch kelgan bo'lishingiz mumkin:
- O'zgaruvchanlik muammosi:
Dateobyekti o'zgaruvchandir. SizDateobyektini biror funksiyaga uzatganingizda, o'sha funksiya uning qiymatini o'zgartirishi mumkin, bu esa oldindan aytib bo'lmaydigan nojo'ya ta'sirlarga va topish juda qiyin bo'lgan xatoliklarga olib keladi. Tasavvur qiling, kelajakdagi sanani hisoblaydigan funksiya tasodifan ilovangizning boshqa joyida ishlatiladigan asl boshlanish sanasini o'zgartirib yuborsa. - Chalkash va nomuvofiq API: API g'alati jihatlarga to'la.
getMonth()0 (Yanvar) dan 11 (Dekabr) gacha qiymat qaytaradi,getDate()esa 1-31 oralig'ida qaytaradi. Bu nomuvofiqlik avlodlar davomida dasturchilarni chalg'itib kelgan.getYear()kabi metodlar ancha oldin eskirgan va yanada ko'proq chalkashliklarga sabab bo'ladi. - Vaqt mintaqasi dahshati: Bu, ehtimol, global ilovalar uchun eng katta og'riqli nuqtadir.
Dateobyekti foydalanuvchining tizim vaqtiga asoslanadi. Turli vaqt mintaqalari bo'yicha hisob-kitoblarni amalga oshirish murakkab, xatolarga moyil va ko'pincha og'ir uchinchi tomon kutubxonalarini talab qiladi. "Nyu-Yorkda soat 9:00 bo'lganda Tokioda soat necha bo'ladi?" kabi oddiy savollar jiddiy muammoga aylanadi. - Bir o'lcham hech kimga to'g'ri kelmaydi:
Dateobyekti har doim vaqtning aniq bir lahzasini (vaqt belgisi) ifodalaydi. Faqat sanani (masalan, tug'ilgan kun, '2023-10-26') yoki faqat vaqtni (masalan, kundalik signal, '08:30:00') ifodalashning toza usuli yo'q. Bu dasturchilarni keraksiz vaqt yoki sana komponentlarini boshqarishga va e'tiborsiz qoldirishga majbur qiladi, bu esa ortiqcha murakkablikni keltirib chiqaradi.
Kelajakka bir nazar: `Temporal` API
Temporal API TC39 qo'mitasi (JavaScript'ni standartlashtiruvchi organ) tomonidan bu muammolarning barchasini hal qilish uchun noldan ishlab chiqilgan. U ishlashni yoqimli qiladigan bir nechta asosiy tamoyillarga qurilgan:
- O'zgarmaslik: Har bir Temporal obyekti o'zgarmasdir. Sanaga 5 kun qo'shish kabi operatsiyani bajarganingizda, u asl obyektni o'zgartirmaydi. Buning o'rniga, u yangilangan qiymat bilan yangi Temporal obyektini qaytaradi. Bu xatolarning katta bir toifasini yo'q qiladi.
- Aniq va tushunarli API: API aniq va oldindan aytib bo'ladigan qilib ishlab chiqilgan. Metodlar mantiqiy nomlangan (masalan,
getDayo'rnigadayOfWeek), va oylar 1 dan boshlanadi (Yanvar uchun 1). Nima ko'rsangiz, o'shani olasiz. - Vaqt mintaqasi va taqvimni birinchi darajali qo'llab-quvvatlash: Vaqt mintaqalari keyin o'ylanadigan narsa emas; ular asosiy xususiyatdir. Siz osongina ma'lum vaqt mintaqalarida sanalarni yaratishingiz, ular o'rtasida konvertatsiya qilishingiz va Yozgi vaqtga o'tish (DST) kabi murakkabliklarni ishonch bilan boshqarishingiz mumkin. Shuningdek, u Grigorian bo'lmagan taqvimlarni ham qo'llab-quvvatlaydi.
- Har bir ehtiyoj uchun boy turdagi to'plamlar: Bitta monolit obyekt o'rniga, Temporal turli xil foydalanish holatlari uchun maxsus obyektlar to'plamini taqdim etadi, bu esa kodingizni yanada ifodali va aniq qiladi.
Bugun va ertani bog'lash: Temporal Polyfill nima?
Polifil (bu atama Polyfilla nomli shpaklyovka brendidan olingan) — bu zamonaviy funksionallikni uni tabiiy ravishda qo'llab-quvvatlamaydigan eski muhitlarda ta'minlaydigan kod qismidir. U brauzer yoki ishga tushirish muhitining veb-standartlarni amalga oshirishidagi bo'shliqlarni to'ldiradi.
Temporal API yangi standartdir. U TC39 jarayonining 4-bosqichida (yakuniy bosqich) bo'lsa-da, brauzer ishlab chiqaruvchilari va Node.js qo'llab-quvvatlovchilariga uni tabiiy ravishda amalga oshirish uchun vaqt kerak. Temporal Polyfill (@js-temporal/polyfill) — bu to'liq Temporal API spetsifikatsiyasini JavaScript'da amalga oshiradigan yuqori sifatli, hamjamiyat tomonidan qo'llab-quvvatlanadigan kutubxonadir. Uni loyihangizga qo'shish orqali siz global Temporal obyekti va uning barcha metodlaridan go'yo ular allaqachon muhitga o'rnatilgandek foydalanishingiz mumkin. Brauzerlar oxir-oqibat tabiiy qo'llab-quvvatlashni chiqarganda, sizning kodingiz muammosiz ishlashda davom etadi, ko'pincha ishlash samaradorligi oshadi.
Loyihangizni Temporal Polyfill bilan sozlash
Boshlash juda oddiy. Siz polifilni o'zingiz yoqtirgan paket menejeri yordamida loyihangizga qo'shishingiz mumkin.
Paket menejeri bilan o'rnatish
Node.js ishlatadigan loyihalar yoki yig'ish bosqichiga ega (Webpack, Vite yoki Parcel kabi) front-end loyihalari uchun terminalingizni oching va ishga tushiring:
npm:
npm install @js-temporal/polyfill
yarn:
yarn add @js-temporal/polyfill
pnpm:
pnpm add @js-temporal/polyfill
Loyihangizga import qilish
O'rnatilgandan so'ng, uni ilovangizning kirish nuqtasida (masalan, asosiy index.js yoki main.ts faylingizda) bir marta import qilishingiz kerak. Bu Temporal obyektini global miqyosda mavjud qiladi.
// Polifilni asosiy ilova faylingizning yuqori qismida import qiling
import { Temporal } from '@js-temporal/polyfill';
// Endi Temporal'dan ilovangizning istalgan joyida foydalanishingiz mumkin!
const now = Temporal.Now.plainDateTimeISO();
console.log(now.toString());
Brauzerda CDN'dan foydalanish
Oddiy veb-sahifalar, demolar yoki CodePen kabi onlayn kod muharrirlari uchun siz polifilni to'g'ridan-to'g'ri HTML faylingizdagi CDN skript tegi yordamida qo'shishingiz mumkin. Uni `Temporal` ishlatadigan o'zingizning skriptlaringizdan oldin joylashtiring.
<!DOCTYPE html>
<html>
<head>
<title>Temporal Polyfill Demo</title>
<!-- Polifilni CDN'dan yuklash -->
<script src="https://cdn.jsdelivr.net/npm/@js-temporal/polyfill/dist/index.umd.js"></script>
</head>
<body>
<script>
// Endi Temporal obyekti global miqyosda mavjud
const today = Temporal.Now.plainDateISO();
console.log(`Bugungi sana ${today.toString()}`);
document.body.innerText = `Bugungi sana ${today.toString()}`;
</script>
</body>
</html>
`Temporal` obyektlari bo'yicha amaliy sayohat (Polifil misollari bilan)
Keling, Temporal tomonidan taqdim etilgan asosiy obyektlarni ko'rib chiqaylik. Ularni tushunish sizning sana/vaqtni boshqarish ehtiyojlaringizning 99 foizini ochib beradi.
`Temporal.PlainDate`: Tug'ilgan kunlar, bayramlar va yubileylar uchun
Bu obyekt hech qanday vaqt yoki vaqt mintaqasi ma'lumotisiz kalendar sanasini ifodalaydi. Bu faqat yil, oy va kunga e'tibor berish kerak bo'lganda juda mos keladi.
// PlainDate yaratish (yil, oy, kun)
const releaseDate = new Temporal.PlainDate(2025, 7, 18);
console.log(releaseDate.toString()); // "2025-07-18"
// Komponentlarni olish (oylar 1 dan boshlanadi!)
console.log(releaseDate.year); // 2025
console.log(releaseDate.month); // 7
console.log(releaseDate.day); // 18
console.log(releaseDate.dayOfWeek); // 5 (Juma)
// O'zgarmaslik amalda: kunlar qo'shish YANGI obyekt qaytaradi
const oneWeekLater = releaseDate.add({ days: 7 });
console.log(releaseDate.toString()); // "2025-07-18" (asli o'zgarmagan)
console.log(oneWeekLater.toString()); // "2025-07-25"
`Temporal.PlainTime`: Kundalik signallar va ish soatlari uchun
Bu sana yoki vaqt mintaqasisiz devor soati vaqtini ifodalaydi. Ish soatlari yoki takrorlanadigan signal haqida o'ylang.
// PlainTime yaratish (soat, daqiqa, soniya)
const openingTime = new Temporal.PlainTime(9, 0, 0);
console.log(openingTime.toString()); // "09:00:00"
const closingTime = Temporal.PlainTime.from('17:30');
console.log(closingTime.toString()); // "17:30:00"
// Vaqtlarni taqqoslash
const appointmentTime = new Temporal.PlainTime(10, 15);
console.log(Temporal.PlainTime.compare(appointmentTime, openingTime)); // 1 (uchrashuv keyinroq)
`Temporal.PlainDateTime`: Vaqt mintaqasi noaniqligisiz mahalliy uchrashuvlar uchun
Bu `PlainDate` va `PlainTime` ni birlashtiradi. U aniq sana va vaqtni ifodalaydi, lekin hali ham vaqt mintaqasidan ajratilgan. Bu vaqt mintaqasi yashirin tushuniladigan mahalliy tish shifokori qabulini rejalashtirish uchun ideal.
const localAppointment = new Temporal.PlainDateTime(2024, 12, 10, 14, 30);
console.log(localAppointment.toString()); // "2024-12-10T14:30:00"
// Siz davomiyliklarni qo'shishingiz mumkin
const oneHourLater = localAppointment.add({ hours: 1 });
console.log(oneHourLater.toString()); // "2024-12-10T15:30:00"
`Temporal.ZonedDateTime`: Global ilovalar qahramoni
Bu xalqaro ilovalar uchun eng kuchli turdir. U aniq bir vaqt mintaqasidagi aniq bir vaqt lahzasini ifodalaydi. U Yozgi vaqtga o'tishni tushunadi va boshqa har qanday vaqt mintaqasiga aniq o'zgartirilishi mumkin.
// Tokiodagi tadbir uchun ZonedDateTime yaratish
// Vaqt mintaqalari IANA identifikatorlaridan foydalanadi (masalan, 'Asia/Tokyo', 'Europe/London')
const tokyoLaunch = new Temporal.ZonedDateTime(
978307200000000000n, // Unix epochasidan nanosekundlar
'Asia/Tokyo'
);
console.log(tokyoLaunch.toString()); // "2001-01-01T09:00:00+09:00[Asia/Tokyo]"
// Nyu-Yorkdagi odam uchun bu qaysi vaqt ekanligini aniqlash
const newYorkTime = tokyoLaunch.withTimeZone('America/New_York');
console.log(newYorkTime.toString()); // "2000-12-31T19:00:00-05:00[America/New_York]"
// Muayyan vaqt mintaqasidagi joriy vaqtni olish
const nowInDubai = Temporal.Now.zonedDateTimeISO('Asia/Dubai');
console.log(`Dubaydagi hozirgi vaqt: ${nowInDubai.toPlainTime()}`);
`Temporal.Instant`: Universal, mashina uchun qulay vaqt belgisi
`Instant` har qanday taqvim yoki vaqt mintaqasidan mustaqil bo'lgan global vaqt chizig'idagi yagona, aniq nuqtani ifodalaydi. U Unix epochasidan nanosekundlarda o'lchanadi va har doim UTC'da bo'ladi. Bu server jurnallari, API vaqt belgilari va ma'lumotlar bazasi yozuvlari uchun juda mos keladi.
// Joriy aniq vaqt lahzasini olish
const now = Temporal.Now.instant();
console.log(now.toString()); // masalan, "2023-10-26T14:45:12.123456789Z"
// Instant'larni taqqoslash oddiy va ishonchli
const later = now.add({ seconds: 30 });
console.log(Temporal.Instant.compare(now, later)); // -1 (hozir oldinroq)
`Temporal.Duration`: Vaqt oraliqlarini aniqlik bilan hisoblash
`Duration` obyekti "3 oy, 2 hafta va 5 soat" kabi vaqt uzunligini ifodalaydi. Bu hisob-kitoblar uchun juda foydali.
// Davomiylik yaratish
const projectDuration = Temporal.Duration.from({ weeks: 6, days: 3 });
console.log(projectDuration.toString()); // "P6W3D"
const startDate = new Temporal.PlainDate(2024, 1, 15);
// Davomiylikni sanaga qo'shish
const deadline = startDate.add(projectDuration);
console.log(deadline.toString()); // "2024-02-29"
// Ikki sana o'rtasidagi farqni hisoblash
const date1 = new Temporal.PlainDate(1999, 8, 24);
const date2 = new Temporal.PlainDate(2023, 10, 26);
const difference = date2.since(date1);
console.log(difference.toString()); // "P24Y2M2D" (24 yil, 2 oy, 2 kun)
console.log(`Yillar: ${difference.years}, Oylar: ${difference.months}, Kunlar: ${difference.days}`);
Temporal Polyfill bilan real hayotdagi muammolarni hal qilish
Keling, bu obyektlar qanday qilib keng tarqalgan, amaliy muammolarni hal qilishini ko'rib chiqaylik.
Foydalanish holati: Global vebinar jadvalini yaratish
Muammo: Siz 15:00 UTC uchun vebinar rejalashtirmoqdasiz. Har bir foydalanuvchiga boshlanish vaqtini ularning mahalliy vaqt mintaqasida va ortga sanoqni ko'rsatishingiz kerak.
`Temporal.ZonedDateTime` bilan yechim:
// 1. Tadbir vaqtini UTC'da belgilang
const webinarInstant = Temporal.Instant.from('2025-03-15T15:00:00Z');
// 2. Foydalanuvchining vaqt mintaqasini oling (haqiqiy ilovada, brauzerdan yoki foydalanuvchi profilidan)
const userTimeZone = 'Europe/Berlin'; // Misol
// 3. Vebinar vaqtini foydalanuvchi vaqt mintaqasiga o'zgartiring
const webinarInUserZone = webinarInstant.toZonedDateTimeISO(userTimeZone);
console.log(`Vebinar soat: ${webinarInUserZone.toPlainTime()} da sizning vaqt mintaqangizda boshlanadi.`);
// Chiqish: "Vebinar soat: 16:00:00 da sizning vaqt mintaqangizda boshlanadi." (Berlin mart oyida UTC+1)
// 4. Orqaga sanoq yaratish
function updateCountdown() {
const now = Temporal.Now.instant();
const timeRemaining = webinarInstant.since(now, { largestUnit: 'day' });
console.log(`Qolgan vaqt: ${timeRemaining.days} kun, ${timeRemaining.hours} soat, ${timeRemaining.minutes} daqiqa.`);
}
// updateCountdown() funksiyasini vaqti-vaqti bilan chaqirish
setInterval(updateCountdown, 1000);
Foydalanish holati: Yosh va yubileylarni aniq hisoblash
Muammo: Kabisa yillari va vaqt komponentlari tufayli `Date` obyekti bilan birovning yoshini yoki biror voqeadan beri o'tgan vaqtni aniq hisoblash qiyin.
`Temporal.PlainDate` bilan yechim:
const birthDate = Temporal.PlainDate.from('1990-06-25');
const today = Temporal.Now.plainDateISO();
const age = today.since(birthDate, { largestUnit: 'year' });
console.log(`Siz ${age.years} yosh, ${age.months} oy va ${age.days} kunliksiz.`);
Foydalanish holati: Obuna to'lov sikllarini boshqarish
Muammo: 31-yanvar kabi sanaga 'bir oy' qo'shish noaniq bo'lishi mumkin. U 28-fevral (yoki 29-fevral) bo'ladimi? Eski `Date` obyekti ko'pincha martga o'tib ketardi.
`Temporal.PlainDate` va opsiyalar bilan yechim:
const subscriptionStart = Temporal.PlainDate.from('2024-01-31');
// Bir oy qo'shish. Temporal kabisa yili mantiqini to'g'ri boshqaradi.
const nextBillingDate = subscriptionStart.add({ months: 1 });
console.log(nextBillingDate.toString()); // "2024-02-29" (chunki 2024 kabisa yili)
const anotherStart = Temporal.PlainDate.from('2023-01-31');
const nextBillingForNonLeap = anotherStart.add({ months: 1 });
console.log(nextBillingForNonLeap.toString()); // "2023-02-28"
Ishlash samaradorligi, to'plam hajmi va ishlab chiqarishga tayyorlik
Amaliy bo'lish muhim. Har qanday polifilni qo'shish ilovangizning to'plam hajmini oshiradi. @js-temporal/polyfill keng qamrovli va 2023-yil oxiriga kelib, u to'plamingizga taxminan 20-30 kB (gzipped) qo'shadi. Bu sezilarli bo'lmasa-da, uni muqobil variantlar bilan solishtirishingiz kerak:
- Moment.js (hozirda eski loyiha) yoki date-fns kabi og'ir uchinchi tomon sana kutubxonalaridan foydalanish. Temporal polifil ko'pincha hajm jihatidan taqqoslanarli, ammo uning asosiy afzalligi kelajakdagi standart bo'lishidir.
- Murakkab, xatolarga moyil qo'lda sana mantiqini yozish. Dasturchi vaqti va yuzaga kelishi mumkin bo'lgan xatoliklar narxi ko'pincha bir necha kilobaytlik polifil narxidan ancha oshib ketadi.
U ishlab chiqarishga tayyormi? Ha. Polifil barqaror, yaxshi sinovdan o'tgan va rasmiy spetsifikatsiyaga amal qiladi. Undan foydalanish orqali siz kelajakka mo'ljallangan kod bazasiga sarmoya kiritasiz.
Oldinda turgan yo'l: Polifildan tabiiy amalga oshirishga
Temporal API taklifi 4-bosqichda, ya'ni u yakunlangan va ECMAScript standartiga kiritishga tayyor. Brauzer va dvigatel ishlab chiqaruvchilari hozirda faol ravishda tabiiy amalga oshirishlar ustida ishlamoqda. 2023-yil oxiri/2024-yil boshlarida siz uni ba'zi brauzerlarda funksiya bayroqlari ostida topishingiz mumkin.
O'tish silliq bo'ladi. Polifil tabiiy Temporal obyekti mavjudligini tekshiradi. Agar mavjud bo'lsa, polifil hech narsa qilmaydi. Agar mavjud bo'lmasa, u global Temporal obyektini yaratadi. Bu shuni anglatadiki, foydalanuvchilaringiz brauzerlarini yangilaganlarida, ilovangiz avtomatik ravishda tezroq, tabiiy amalga oshirishdan foydalanishni boshlaydi va siz birorta ham kod satrini o'zgartirishingiz shart bo'lmaydi.
Xulosa: Zamonaviy JavaScript'dagi keyingi qadamingiz
JavaScript'ning `Date` obyekti bilan kurashish kunlari sanoqli. Temporal API real hayotdagi muammolarni nafislik va aniqlik bilan hal qiladigan mustahkam, intuitiv va kuchli muqobilni taqdim etadi. Temporal Polyfill'ni qabul qilish orqali siz shunchaki yangi kutubxonadan foydalanmayapsiz; siz ilovalaringizni kelajakka tayyorlayapsiz va kodingizni JavaScript tilining rasmiy yo'nalishi bilan moslashtiryapsiz.
Oddiy rejalashtirish vositasini yoki murakkab global platformani qurayotgan bo'lsangiz ham, Temporal'dan foydalanish natijasida erishilgan aniqlik va ishonchlilik juda katta. `getMonth()` bilan kurashishni to'xtating. Vaqt mintaqalari haqida qayg'urishni to'xtating. Bugundan boshlab toza, xavfsizroq va yanada ifodali sana va vaqt kodini yozishni boshlang. Sizning kelajakdagi o'zingiz va xalqaro foydalanuvchilaringiz sizga rahmat aytadi.